# frozen_string_literal: true

class AnnualReport::MostRebloggedAccounts < AnnualReport::Source
  MINIMUM_REBLOGS = 1
  SET_SIZE = 10

  def generate
    {
      most_reblogged_accounts: most_reblogged_accounts.map do |(account_id, count)|
                                 {
                                   account_id: account_id.to_s,
                                   count: count,
                                 }
                               end,
    }
  end

  private

  def most_reblogged_accounts
    report_statuses.where.not(reblog_of_id: nil).joins(reblog: :account).group(accounts: [:id]).having(minimum_reblog_count).order(count_all: :desc).limit(SET_SIZE).count
  end

  def minimum_reblog_count
    Arel.star.count.gt(MINIMUM_REBLOGS)
  end
end
